package pl.ps.wi.monitoring.station;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.TimerTask;

import pl.ps.wi.monitoring.station.enums.AlertEvents;
import pl.ps.wi.monitoring.station.interfaces.DataCollector;

/** 
* Zawiera definicję klasy MainTask dziedziczącej po TimerTask
*
* @file MainTask.java
* @class MainTask
* @date 2010.05.19
* @version 1.0
* @brief Klasa zawiera konstruktor parametryczny oraz metodę uruchamiającą cykliczny wątek
*/


public class MainTask extends TimerTask {

/**
* Obiekt typu Runnable, służy do zaimplementowania w nim funkcji run(), która będzie wykonywana przez osobny wątek
*/
	private final Runnable runnable;
	
/** 
* Konstruktor parametryczny, przyjmujący listę z czujnikami oraz referencje do obiektu odpowiedzialnego za połączenie z bazą danych
* Metoda ta na czujnikach będących kamerami - pobiera zdjęcie, następnie wstawia zdjęcie oraz id urządzenia kamery do bazy danych pod id równym aktualnemu znacznikowi czasu.
* Natomiast na czujnikach będących czujnikami temperatury - pobiera temperaturę, wyświetla ją na ekran, następnie sprawdza czy temperatura
* jest zbyt niska lub zbyt wysoka, jeżeli tak, to wysyła sms'a z informacją o zbyt wysokiej/niskiej temperaturze, następnie wstawia do bazy danych
* pomiar temperatury oraz id czujnika pod id będącym aktualnym znacznikiem czasu. W przypadku błędu zwracany jest wyjątek typu SQLException.
* @param sensors Lista typu DataCollector zawierająca informację o czujnikach/kamerach
* @param conn Referencja do obiektu odpowiedzialnego za połączenie oraz operacje na bazie danych.
* @throws java.sql.SQLException
*/

	public MainTask(final List<DataCollector> sensors, final DBConnector conn) {
		runnable = new Runnable() {
			@Override
			public void run() {
				for (DataCollector sensor : sensors) {
					//System.out.print(new Date() + ": ");
					String data = sensor.getData();
					Date now = new Date();
					try {
						int timeID = conn.insertTimeStamp(now);
						conn.insertTimeStamp(now);
						switch (sensor.getType()) { 
						case CAM:
						/* moduł został zastąpiony innym, odpowiada za to klasa Recorder
							String camFileName = sensor.getData();
							conn.insertPicture(timeID, sensor.getDevId(), camFileName);						  
						 */
							break;
						case TEMP:
							Float temperature = Float.valueOf(data);
							//System.out.println("Temp get: " + data + "");
							String highTemp = AlertEvents.HIGH_TEMPERATURE.getAdditionalArgument();
							String lowTemp = AlertEvents.LOW_TEMPERATURE.getAdditionalArgument();
							if (highTemp != null && temperature > Float.valueOf(highTemp)) {
								Phone.sendHighTemperatureMessage();
							} else if (lowTemp != null && temperature < Float.valueOf(lowTemp)) {
								Phone.sendLowTemperaturemessage();
							}
							conn.insertTemperature(timeID, sensor.getDevId(), temperature);
							break;
						}
					} catch (SQLException e) {
						e.printStackTrace();
					}
					//System.out.println(" | " +new Date());
				}
			}
		};
	}
	
/**
* Metoda służąca do zainicjalizowania wątku, ustawia zdefiniowany wcześniej obiekt runnable jako wątek i uruchamia go
*/
	@Override
	public void run() {
		Thread daemon = new Thread(runnable);
		daemon.setDaemon(true);
		daemon.start();
	}

}